kerase Model to Estimator

케라스 모델에서 추정기 변환
케라스 모델을 추정기로 바꾸는 것은 학계는 물론 산업 분야에서도 유용하다.
개발한 모델을 배포하거나, 조직 내 다른 구성원에게 공유할 때 사용한다.

추정기로 변환할 시, 분산 훈련이나 체크포인트 자동 저장과 같은 장점을 활용할 수 있다.(사용하기도 쉬움)
XOR
tf.random.set_seed(1)
np.random.seed(1)
x=np.random.uniform(low=-1, high=1, size=(200, 2))
y=np.ones(len(x))
y[x[:, 0]*x[:, 1]<0]=0
x_train=x[:100, :]
y_train=y[:100]
x_valid=x[100:, :]
y_valid=y[100:]
케라스 모델 생성
model=tf.keras.Sequential([
tf.keras.layers.Input(shape=(2,), name='input-features'),
tf.keras.layers.Dense(units=4, activation='relu'),
tf.keras.layers.Dense(units=4, activation='relu'),
tf.keras.layers.Dense(units=4, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')])
1. 입력 함수 정의
def train_input_fn(x_train, y_train, batch_size=8):
dataset=tf.data.Dataset.from_tensor_slices(({'input-features':x_train}, y_train.reshape(-1, 1)))
return dataset.shuffle(100).repeat().batch(batch_size)
def eval_input_fn(x_test, y_test=None, batch_size=8):
if y_test is None:
dataset=tf.data.Dataset.from_tensor_slices({'input-features':x_test})
else:
dataset=tf.data.Dataset.from_tensor_slices(({'input-features':x_test}, y_test.reshape(-1, 1)))
return dataset.batch(batch_size)
2. 특성열 정의
features=[tf.feature_column.numeric_column(key='input-features:', shape=(2,))]
3. tf.keras.estimator.moel_to_estimator를 이용하여 모델을 추정기로 변환
model.compile(optimizer=tf.keras.optimizers.SGD(),
loss=tf.keras.losses.BinaryCrossentropy(),
metrics=[tf.keras.metrics.BinaryAccuracy()])
my_estimator=tf.keras.estimator.model_to_estimator(
keras_model=model,
model_dir='/Users/csian/Desktop/CP/data_set/model/estimator-for-XOR/')
4. 추정기를 사용하여 모델을 훈련, 검증 데이터셋 평가
num_epochs=200
batch_size=2
steps_per_epoch=np.ceil(len(x_train)/batch_size)
my_estimator.train(input_fn=lambda:train_input_fn(x_train, y_train, batch_size), steps=num_epochs*steps_per_epoch)
my_estimator.evaluate(input_fn=lambda:eval_input_fn(x_valid, y_valid, batch_size))

{'binary_accuracy': 0.68, 'loss': 0.66176957, 'global_step': 10000}

self) 모델을 통한 학습(fit)
model=tf.keras.Sequential([
tf.keras.layers.Input(shape=(2,), name='input-features'),
tf.keras.layers.Dense(units=4, activation='relu'),
tf.keras.layers.Dense(units=4, activation='relu'),
tf.keras.layers.Dense(units=4, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')])
model.compile(optimizer=tf.keras.optimizers.SGD(),
loss=tf.keras.losses.BinaryCrossentropy(),
metrics=[tf.keras.metrics.BinaryAccuracy()])
hist=model.fit(x_train, y_train, validation_data=(x_valid, y_valid), epochs=200, batch_size=2, verbose=0)
history=hist.history
bi_acc=history['binary_accuracy'][-1]
loss=history['loss'][-1]
print('accuracy: %.4f, loss: %.4f' %(bi_acc, loss))

accuracy: 0.9900, loss: 0.0211

Estimator가 문제가 있는 것 같다… 추후 확인해 볼 것